//#include <stdio.h>
//
//int main() 
//{
//    int n, m;
//    scanf_s("%d %d", &n, &m);
//    int graph[101][101] = { 0 };
//    int deg[101] = { 0 };
//
//    for (int i = 0; i < m; i++) 
//    {
//        int a, b;
//        scanf_s("%d %d", &a, &b);
//        graph[a][b] = 1;
//        graph[b][a] = 1;
//        deg[a]++;
//        deg[b]++;
//    }
//
//    int count = 0;
//    while (1)
//    {
//        int to_remove[101];
//        int num = 0;
//        for (int i = 1; i <= n; i++) 
//        {
//            if (deg[i] == 1) 
//            {
//                to_remove[num++] = i;
//            }
//        }
//        if (num == 0)
//        {
//            break;
//        }
//        for (int i = 0; i < num; i++) 
//        {
//            int node = to_remove[i];
//            deg[node] = 0;
//            for (int j = 1; j <= n; j++)
//            {
//                if (graph[node][j] == 1 && deg[j] > 0) 
//                {
//                    deg[j]--;
//                }
//            }
//        }
//        count++;
//    }
//
//    printf("%d\n", count);
//    return 0;
//}

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n;
    scanf_s("%d", &n);
    int* next = (int*)malloc((n + 1) * sizeof(int));
    for (int i = 1; i <= n; i++) 
    {
        scanf_s("%d", &next[i]);
    }

    int* indeg = (int*)calloc(n + 1, sizeof(int));
    for (int i = 1; i <= n; i++) 
    {
        indeg[next[i]]++;
    }

    int* inCycle = (int*)malloc((n + 1) * sizeof(int));
    for (int i = 1; i <= n; i++) 
    {
        inCycle[i] = 1;
    }

    int* queue = (int*)malloc(n * sizeof(int));
    int front = 0, rear = 0;
    for (int i = 1; i <= n; i++) 
    {
        if (indeg[i] == 0) 
        {
            queue[rear++] = i;
            inCycle[i] = 0;
        }
    }

    int* removeOrder = (int*)malloc(n * sizeof(int));
    int count_remove = 0;

    while (front < rear) 
    {
        int u = queue[front++];
        removeOrder[count_remove++] = u;
        int v = next[u];
        indeg[v]--;
        if (indeg[v] == 0) 
        {
            queue[rear++] = v;
            inCycle[v] = 0;
        }
    }

    int* ans = (int*)calloc(n + 1, sizeof(int));
    for (int i = 1; i <= n; i++) 
    {
        if (inCycle[i])
        {
            ans[i] = i;
        }
    }

    for (int i = count_remove - 1; i >= 0; i--)
    {
        int u = removeOrder[i];
        ans[u] = ans[next[u]];
    }

    for (int i = 1; i <= n; i++)
    {
        printf("%d ", ans[i]);
    }
    printf("\n");

    free(next);
    free(indeg);
    free(inCycle);
    free(queue);
    free(removeOrder);
    free(ans);
    return 0;
}